// Kony


#include "AbilitySystem/Debuff/DebuffNiagaraComponent.h"

#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"
#include "Interaction/CombatInterface.h"

UDebuffNiagaraComponent::UDebuffNiagaraComponent()
{
	//不自动激活，由技能控制效果是否激活
	bAutoActivate = false;
	
}

void UDebuffNiagaraComponent::BeginPlay()
{
	Super::BeginPlay();
	//获取技能系统组件
	UAbilitySystemComponent* ASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetOwner());
	//获取战斗接口
	ICombatInterface* CombatInterface = Cast<ICombatInterface>(GetOwner());
	if (ASC)
	{
		//注册DebuffTag标签事件，当标签被添加或移除时触发DebuffTagChanged回调函数
		ASC->RegisterGameplayTagEvent(DebuffTag, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &UDebuffNiagaraComponent::DebuffTagChanged);
	}
	//判断是否存在战斗接口，如果存在就创建监听能力组件的广播
	else if (CombatInterface)
	{
		//从接口注册到获取能力系统组件，使用AddWeakLambda表达式 比普通的AddLambda表达式 更加安全，会检查指针是否有效，弱无效则不会执行该表达式
		CombatInterface->GetOnASCRegisteredDelegate().AddWeakLambda(this,[this](UAbilitySystemComponent* InASC)
		{
			InASC->RegisterGameplayTagEvent(DebuffTag, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &UDebuffNiagaraComponent::DebuffTagChanged);
		});
	}
	if (CombatInterface)
	{
		//监听角色死亡广播，如果角色死亡执行函数
		CombatInterface->GetOnDeathDelegate().AddDynamic(this, &UDebuffNiagaraComponent::OnOwnerDeath);
	}
}
//异常标签改变
void UDebuffNiagaraComponent::DebuffTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
	//获取角色
	const bool bOwnerValid = IsValid(GetOwner());
	//获取角色是否存活
	const bool bOwnerAlive = GetOwner()->Implements<UCombatInterface>() && !ICombatInterface::Execute_IsDead(GetOwner());
	//计数大于0，激活 , 只有在角色存在并且存活的时候才执行激活
	if (NewCount > 0 && bOwnerValid && bOwnerAlive)
	{
		Activate();
	}else
	{
		//销毁
		Deactivate();
	}
}
//处理角色死亡函数
void UDebuffNiagaraComponent::OnOwnerDeath(AActor* DeadActor)
{
	//销毁
	Deactivate();
}
